package com.jeecg.common;

import java.text.MessageFormat;

/**
 * 业务异常
 * 
 * <p>
 * 严格意义上讲，要求所有接口对外都只能抛出业务异常。业务异常的代码可自定义。
 * 
 * @author Debenson
 * @since 0.1
 */
public class ServiceException extends Exception {
  private static final long serialVersionUID = -94609761041935299L;

  private int code;

  /**
   * 默认构造函数，异常默认为: {@link ExceptionCode#FAILED}。
   */
  public ServiceException() {
    this(ExceptionCode.failed);
  }

  /**
   * 构造函数
   * 
   * @param code
   *          异常代码，取值{@link ExceptionCode}中定义的常量。
   */
  public ServiceException(ExceptionCode code) {
    this(code.getCode(), code.getMessage(), null);
  }

  /**
   * 构造函数
   * 
   * @param caught
   *          异常。
   */
  public ServiceException(Throwable caught) {
    this(ExceptionCode.failed.getCode(), caught.getMessage(), caught);
  }

  /**
   * 构造函数
   * 
   * @param message
   *          异常信息。
   */
  public ServiceException(String message) {
    this(ExceptionCode.failed.getCode(), message, null);
  }

  /**
   * 构造函数
   * 
   * @param code
   *          异常代码，取值{@link ExceptionCode}中定义的常量。
   * @param arguements
   *          参数。
   */
  public ServiceException(ExceptionCode code, Object... arguements) {
    this(code.getCode(), MessageFormat.format(code.getMessage(), arguements), null);
  }

  /**
   * 构造函数
   * 
   * @param code
   *          异常代码，取值{@link ExceptionCode}中定义的常量。
   * @param message
   *          异常描述。
   */
  public ServiceException(int code, String message) {
    this(code, message, null);
  }

  /**
   * 构造函数
   * 
   * @param code
   *          异常代码，取值{@link ExceptionCode}中定义的常量。
   * @param message
   *          异常描述。
   * @param caught
   *          异常。
   */
  public ServiceException(int code, String message, Throwable caught) {
    super(message, caught);
    this.code = code;
  }

  /** 异常代码，取值{@link ExceptionCode}中定义的常量。 */
  public int getCode() {
    return code;
  }

  public void setCode(int code) {
    this.code = code;
  }

}
